#include <stdio.h>
#include <omp.h>

float x, y;
#pragma omp threadprivate(x, y)

void init(float a, float b, int num_threads) {
    #pragma omp single copyprivate(a, b, x, y)
    {
        // 主线程更新全局值
        printf("更新 %d (共 %d 个线程), a, b, x, y 的值: \n", num_threads);
        scanf("%f %f %f %f", &a, &b, &x, &y);
        printf("主线程更新值: a = %f, b = %f, x = %f, y = %f\n", a, b, x, y);
    }
}

int main() {
    // 初始值 x 和 y 为 0
    x = 0.0f;
    y = 0.0f;

    // 使用 OpenMP 并行区域
    #pragma omp parallel
    {
        int thread_id = omp_get_thread_num();
        int num_threads = omp_get_num_threads();

        // 每个线程初始的 x 和 y 值
        printf("线程 %d (共 %d 个线程): 初始 x = %f, y = %f\n", thread_id, num_threads, x, y);

        // 调用 init 函数，使用 copyprivate 将值从主线程更新到其他线程
        init(0.0f, 0.0f, thread_id);

        // 验证 copyprivate 的效果
        printf("线程 %d (共 %d 个线程): 更新后的 x = %f, y = %f\n", thread_id, num_threads, x, y);
    }

    return 0;
}